/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.ide.ext.gwt.client.command;

import org.eclipse.che.ide.CommandLine;

/**
 * Model of the command line for launching GWT Code Server.
 *
 * @author Artem Zatsarynnyi
 */
class GwtCommandModel {

    private String workingDirectory;
    private String gwtModule;
    private String codeServerAddress;

    GwtCommandModel(String workingDirectory, String gwtModule, String codeServerAddress) {
        this.workingDirectory = workingDirectory;
        this.gwtModule = gwtModule;
        this.codeServerAddress = codeServerAddress;
    }

    /** Crates {@link GwtCommandModel} instance from the given command line. */
    static GwtCommandModel fromCommandLine(String commandLine) {
        final CommandLine cmd = new CommandLine(commandLine);

        String workingDirectory = null;
        String gwtModule = null;
        String codeServerAddress = null;

        if (cmd.hasArgument("-f")) {
            workingDirectory = cmd.getArgument(cmd.indexOf("-f") + 1);
        }

        for (String arg : cmd.getArguments()) {
            if (arg.startsWith("-Dgwt.module=")) {
                gwtModule = arg.split("=")[1];
            } else if (arg.startsWith("-Dgwt.bindAddress=")) {
                codeServerAddress = arg.split("=")[1];
            }
        }

        return new GwtCommandModel(workingDirectory, gwtModule != null ? gwtModule : "", codeServerAddress);
    }

    String getWorkingDirectory() {
        return workingDirectory;
    }

    void setWorkingDirectory(String workingDirectory) {
        this.workingDirectory = workingDirectory;
    }

    String getGwtModule() {
        return gwtModule;
    }

    void setGwtModule(String gwtModule) {
        this.gwtModule = gwtModule;
    }

    String getCodeServerAddress() {
        return codeServerAddress;
    }

    void setCodeServerAddress(String codeServerAddress) {
        this.codeServerAddress = codeServerAddress;
    }

    String toCommandLine() {
        final StringBuilder cmd = new StringBuilder(GwtCommandType.COMMAND_TEMPLATE);
        if (!workingDirectory.trim().isEmpty()) {
            cmd.append(" -f ").append(workingDirectory.trim());
        }
        if (!gwtModule.trim().isEmpty()) {
            cmd.append(" -Dgwt.module=").append(gwtModule.trim());
        }
        if (!codeServerAddress.trim().isEmpty()) {
            cmd.append(" -Dgwt.bindAddress=").append(codeServerAddress.trim());
        }

        return cmd.toString();
    }
}
